5.3.2 -
Le système de fichiers
UNIX :
5.3.2.A - Organisation du système de
fichiers :
Le système Unix organise son information sous la forme d’une
arborescence de répertoires et de fichiers. Les entrées d’un
répertoire peuvent être des fichiers ordinaires, des liens sur
d’autres fichiers, des pilotes de périphériques ou encore
d’autres répertoires. A chacune de ces entrées correspond un
ensemble d’informations comme le type et la taille du fichier, le nombre
de liens et les différentes dates le concernant,
c’est-à-dire date de création, de dernière
modification et de dernier accès, et enfin le propriétaire, le
groupe et les permissions qui lui sont associées. L’organisation
des systèmes de fichiers varie suivant qu’il s’agit de Unix
System V ou de Unix BSD. Actuellement, de nombreuses implémentations de
Unix System V ont adopté l’organisation BSD.
Un système
de fichiers traditionnel de Unix System V est contenu dans une partition de
disque. Il est formé de quatre composants principaux :
Le boot block est le bloc de
démarrage. C’est un bloc physique de 512 octets destiné
à contenir un programme que l’on appelle le programme de bootstrap.
C’est le programme qui initialise le système lorsqu’il
s’agit du système de fichier contenant la racine (root).
Le super-bloc contient toutes les
informations nécessaires au système pour gérer le
système de fichier. C’est-à-dire :
- le numéro du premier bloc allouable ;
- la taille du système de fichiers ;
- la table de gestion des blocs libres ;
- la table de gestion des inodes libres ;
- les verrous ;
- la date de dernière mise à jour ;
- le nombre de blocs libres ;
- le nombre d’inodes libres ;
- des informations sur le périphérique ;
- le nom du système de fichier ;
- le nom du volume ;
- le type de système de fichier ;
- les inodes :
A la suite du super-bloc viennent des blocs
qui contiennent les inodes des fichiers du système. Le nombre de blocs
d’inodes varie en fonction de la taille du système de fichier. Il y
a une inode par fichier ou répertoire. Une inode contient toutes les
informations permettant de retrouver les données du fichier qu’il
représente. Chaque inode occupe 64 octets et contient les informations
suivantes :
- le type de fichier ;
- le mode (permissions d’accès) du fichier ;
- le nombre de liens ;
- l’identification du propriétaire (UID) ;
- l’identification du groupe (GID) ;
- la taille du fichier en nombre d’octets ;
- la table des 13 blocs de données ou
d’indirection structurée de la façon
suivante :
- 10 adresses de blocs de données ;
- 1 adresse de bloc de simple indirection ;
- 1 adresse de bloc de double indirection ;
- 1 adresse de bloc de triple indirection ;
- les blocs de données ;
- la date de création, de dernière modification et de dernier
accès ;
- les blocs de données :
les blocs qui se trouvent
à la suite du super-bloc contiennent les données des fichiers
proprement dits où sont des blocs d’indirection qui contiennent des
adresses d’autres blocs d’indirection ou de
données.
5.3.2.B - La gestion des fichiers et des
permissions associées :
A chaque fichier correspond une inode qui contient toutes les informations
concernant ce fichier. C’est-à-dire :
- l’adresse des blocs de données sur le disque ;
- le type de fichier ;
- la taille du fichier en octets ;
- les dates de création, dernière modification et dernier
accès ;
- le nombre de liens ;
- l’identification du propriétaire, l’UID ;
- l’identification du groupe, le GID ;
- les permissions d’accès ou mode.
5.3.2.B.1 - Les différents droits
possibles :
Le champ représentatif des permissions est formé de trois
groupes de trois caractères. Chacun des groupes représente les
droits en lecture, écriture et exécution pour un certain ensemble
de personnes. Les trois premiers caractères représentent les
droits du propriétaire du fichier, les trois suivants concernent les
droits des membres du groupe auquel appartient le propriétaire, en fin
les trois derniers caractères sont les droits des autres utilisateurs,
communément appelés le reste du monde. La signification de ces
caractères est la suivante :
- r : permission de lecture (read) ;
- w : permission d’ecriture (write) ;
- x : permission d’exécution (execute) ;
- - : pas de permission.
5.3.2.B.1.a - Le droit en lecture
(r) :
Un utilisateur qui a le droit de lecture sur un fichier peut en consulter
le contenu. Un utilisateur qui a le droit de lecture sur un répertoire
peut consulter la liste des fichiers qu’il contient, ce qui ne signifie
pas que cet utilisateur puisse consulter leur contenu. De plus, pour avoir la
liste étendue des fichiers (ls –l) d’un répertoire
autorisé en lecture, il faut aussi que ce dernier offre également
le droit d’exécution.
Un utilisateur qui a le droit en lecture
sur un répertoire peut consulter la liste des fichiers qui se trouve dans
le répertoire.
5.3.2.B.1.b - Le droit en écriture
(w) :
Un utilisateur qui a le droit d’écriture sur un fichier peut
modifier son contenu. Un utilisateur qui a ce même droit sur un
répertoire peut y créer des fichiers, mais ne pourra modifier les
fichiers existants que s’il possède aussi les droits
d’écriture sur ces fichiers.
Un utilisateur qui a le droit en
écriture sur un répertoire peut créer ou de supprimer les
fichiers présents dans le répertoire, à condition de
disposer aussi du droit d’exécution.
5.3.2.B.1.c - Le droit en exécution
(x) :
Le droit d’exécution signifie pour un fichier qu’il est
exécutable comme une commande. Dans le cas d’un répertoire,
le droit x est un droit de recherche dans ce répertoire.
Dans
l’exemple suivant la commande ls-l permet d’obtenir la liste des
droits concernant trois fichiers cmd1, F1 et liste :
-rwxr-x--- 1 marc
sys 256 Nov 2 15:46 cmd1
-rw-rw--r - 1 nadege public 170 Aug 2 14:16
F1
-rw-rw- r- - 1 aurore public 3456 Dec 8 11:52 Liste
Le
premier caractère indique le type de fichier :
- - : fichier ordinaire
- d : répertoire
- c ou b : fichier spécial.
Les 3 caractères
suivants indiquent les droits d’accès du propriétaire
:
- r : permission de lecture (read).
- w : permission d’écriture (write).
- x : permission d’exécution.
- - : pas de permission.
Ensuite, apparaissent les droits
d’accès pour les membres du groupe auquel appartient le
propriétaire du fichier : caractères 5, 6 et 7. En fin, les 3
derniers caractères (numéros 8, 9 et 10) représentent les
droits des autres utilisateurs du système.
Dans la liste
précédente, le fichier cmdl appartient à marc du groupe
sys. Le propriétaire, marc, peut le lire, le modifier ou
l’exécuter, les membres du groupe sys ont le droit de le lire ou de
l’exécuter, mais ils n’ont pas le droit de le modifier, et
les autres n’ont aucun droit. Les fichiers F1 et Liste qui appartiennent
à nadege et aurore, du groupe public, sont lisibles par tous, mais ne
peuvent être modifiés que par les membres du groupe public, dont
bien sûr leurs propriétaires respectifs.
5.3.2.B.2 - Les droits particuliers : SUID,
SGID et Sticky Bit
Certaines commandes posent le problème suivant : pour
s’exécuter, elles doivent donner des permissions qu’un
utilisateur ne devrait normalement pas avoir. L’exemple le plus
évident est celui de la commande « passwd » qui
permet de modifier le mot de passe. Cette commande modifie le fichier
« /etc/passwd » (ou le fichier
« /etc/shadow ») qui contient entre autres les mots de passe
cryptés de tous les utilisateurs, alors que l’utilisateur normal
n’a pas les permissions d’écriture sur ce fichier.
Pour
résoudre ce problème, le système donne temporairement
à un utilisateur, les droits nécessaires sur le fichier
« /etc/passwd », et uniquement durant le temps le temps
d’exécution de la commande. L’administrateur a donc la
possibilité de positionner le « set user id » bit, qui assure
de manière temporaire les droits du propriétaire. Le « set
group id » bit donne les droits du groupe.
Un fichier dont le SUID bit
est positionné est un fichier exécutable avec les droits de son
propriétaire. Un fichier dont le SGID bit est positionné est un
fichier exécutable avec les droits du groupe de son propriétaire.
Un processus qui s’exécute avec le SUID bit positionné a son
UID effectif égal à l’UID du propriétaire du
programme correspondant. Un processus qui s’exécute avec le SGID
bit positionné a son GID effectif égal au GID du programme
correspondant.
Ces règles ne vont pas sans poser un certain nombre de
problèmes au niveau de la sécurité. En effet, un
utilisateur qui exécute un programme appartenant à root et dont le
SUID est positionné dispose automatiquement des droits du
super-utilisateur le temps de ce programme.
Le sticky bit a un rôle
tout à fait particulier. Si un programme est très
fréquemment utilisé, il peut être souhaitable, pour des
raisons de performances, que son code réside en permanence en
mémoire. On gagne ainsi à chaque appel le temps de chargement en
mémoire à partir de son disque de résidence. Pour
qu’il reste résident en mémoire, on positionne le sticky
bit, ou plus exactement le « bit collant ». Tout fichier
exécutable dont le sticky bit est positionné reste en
mémoire après son exécution. Il y a, bien sûr, un
équilibre à trouver entre la mémoire disponible et le temps
d’exécution. Positionner le sticky bit est un privilège de
l’administrateur du système. Les améliorations
apportées à la gestion de la mémoire ont rendu son
utilisation obsolète.
5.3.2.B.3 - La modification des
droits :
Modifier le statut d’un fichier revient à changer ses droits
d’accès, ou son propriétaire ou son groupe, ou encore les
trois attributs. Tout fichier ou répertoire créé sur UNIX
appartient à un propriétaire qui est généralement le
créateur du fichier, et par conséquent un utilisateur connu du
système. Tout utilisateur du système UNIX fait partie d’un
groupe utilisateurs et ce groupe fait partie des caractéristiques du
fichier. Enfin, comme UNIX est Multi-Utilisateur, un fichier est
protégé par des droits d’accès que seul son
propriétaire peut modifier, si l’on fait exception des
privilèges particuliers de l’administrateur du système.
Modifier les droits d’accès d’un fichier ou d’un
répertoire revient à modifier son mode.